package com.hairline.hairlinemarket.shiro;

import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.springframework.stereotype.Component;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;

/**
 * @author stone
 * @date 2023/04/21 11:35
 */
@Component
public class WdSessionManager extends DefaultWebSessionManager {
    // 可以保证跨域请求Session的一致性问题？为啥要做会话管理
    // Subject和会话有关系 → Principal和Subject
    // 如果Subject变了，Principal变了，认证状态也就变了
    private static final String WX_TOKEN_HEADER = "X-CskaoyanMarket-Token";
    private static final String ADMIN_TOKEN_HEADER = "X-CskaoyanMarket-Admin-Token";


    @Override
    protected Serializable getSessionId(ServletRequest servletRequest, ServletResponse response) {
        // 能否获得请求报文中的值呢？
        // 请求报文分为请求头、请求行、请求体
        // 获得登录时候的Subject的SessionId → 如果登录成功 subject的isAuthenticated的值为true
        // 登录的时候将SessionId给到前端，前端把这个值缓存起来，发送请求的时候携带这个值
        //
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        String sessionId = request.getHeader(WX_TOKEN_HEADER);
        if (sessionId != null && sessionId.length() > 0) {
            return sessionId;
        }
        return super.getSessionId(request, response);
    }
}
